package current.security.access;

import java.util.Map;
import org.apache.log4j.Logger;

import platform.util.Util;

public abstract class DefaultAccessValidateServiceImpl implements AccessValidateService {
	
	private Logger log = Logger.getLogger(this.getClass());
	
	public String isAllowAccess(Map<String,String > map,Map<String ,Object> suser,String url){
		//获取MAP中的用户角色信息
		String roles = null;
    	if(suser != null){
    		roles = (String)suser.get("roleName");
    	}
    	//验证是否有权限
		return validate(map, roles ,url);
	}

	public String validate(Map<String,String> map,String roles,String url) {
			//获取此url的权限
			String str = map.get(url);
			//如果权限为空则可能表明为为直接配置此URL，需要验证此URL的上级是否被定义
	    	if(Util.isNull(str)){
	    		//如果没有找到直接对应的，则从后往前截取字符串加上两个**号进行再次匹配。如果匹配到就退出，之后再有也不在查找，以先找到的为准。
	    		if(!url.equals("/")){
	    			String sss = url;
	    			for(int i = 0 ; i < url.split("/").length-1 ; i++){
	    				sss = sss.substring(0,sss.lastIndexOf("/"));
	    				str = map.get(sss+"/**");
	    				if(!Util.isNull(str)){
	    					return forAccess(str,roles);
	    				}
	    			}
	    		}else{
	    			log.debug("该URL为跟目录URL");
	    			str = map.get(url+"**");
	    			return forAccess(str,roles);
	    		}
	    	}else{
	    		log.debug("直接取到该URL，进行访问验证！");
	    		return forAccess(str,roles);
	    	} 	
	    	log.debug("拒绝访问，此URL "+url+" 以及此URL的上级并未在数据库中定义！！");
	    	return "ERROR";
	}
	
	private String forAccess(String str,String roles){
		String type = str.substring(str.indexOf(":")+1);
		str = str.substring(0,str.indexOf(":"));
		log.debug("获取到类型："+type);
		log.debug("获取到访问角色："+str);
		if( !Util.isNull(type) && type.equals("REJECT") ){
			log.debug("允许访问！获取到此链接在排除列表里！");
			return "REJECT";
		}else if( !Util.isNull(type) && type.equals("URL") ){
			if( !Util.isNull(str) && !str.equals("NOROLE") ){
				if( roles != null ){
					if( str!=null && str.length() > 0 && str.indexOf(",") != -1){
						String strArray [] = str.split(",");
						boolean bool = false;
						for (int i = 0; i < strArray.length; i++) {
							if(roles.equals(strArray[i])){
								bool = true;
								break;
							}
						}
						if( bool ){
							return "ACCEPT";
						}else{
							return "REFUSED";
						}
					}else{
						if(roles.equals(str)){
							return "ACCEPT";
						}else{
							return "REFUSED";
						}
					}
		    	}else{
		    		log.debug("拒绝访问！！此用户未登录，并且此页面需要访问角色！");
		    		return "NOTLOGON";
		    	}
			}else{
				log.debug("用户未登录！此页面在数据库中配置错误，既不是排除页面，也没有角色与其对应，请重新配置定义。");
				return "ERROR";
			}
		}else{
			return "ERROR";
		}
	}
}
